/**
 * 木棒
 * 有一组等长的木棒被砍成小木棍，问再将这些小木棍拼成等长的原始木棍，原始木棍的长度。
 *
 * DFS 剪枝
 *
 * 1. 优先尝试较长的木棍
 * 2. 限制先后加入一根原始木棒的木棍的长度递减
 * 3. 对于当前原始木棒，记录最近一次拼接的木棍长度
 * 4.
 */

#include <bits/stdc++.h>
using namespace std;
const int N = 100;
int a[N],  // 现有木棍
    n,     // 总木棍数
    len,   // 目标原始木棒长度
    cnt;   // 目标原始木棒数，满足 cnt * len = sum(a)
bool v[N];
/**
 * @param stick 正在拼接第 stick 根原始木棒（已经拼好了
 * @param cab 手头这根原始木棒已经拼好的长度
 * @param last 上一根拼接小木棍的下标
 * @return 该分支是否成功
 */
bool dfs(int stick, int cab, int last) {
  // 所有原始木棒已经拼好，搜索成功
  if (stick > cnt) return true;
  // 第 stick 根木棒已经拼到 len，开始拼第 stick+1 根
  if (cab == len) return dfs(stick + 1, 0, 1);
  // 剪枝 2：上一个拼接失败的长度，不要重复尝试同一长度的木棒
  int fail = 0;

  for (int i = last; i <= n; ++i) {
    if (!v[i] &&  // 图上 DFS，从大到小使用木棒，不能重复使用木棒
        cab + a[i] <= len &&  // 如果拼上去会超过 len，那就换小一点的
        // 不要重复尝试同一长度的木棒，因为已经回溯过一次，必然产生相同的结果
        fail != a[i]) {
      // 恭喜进入循环
      v[i] = true;  // 上锁
      // 可以拼上，拼接第 stick 根原始木棒，长度变为了 cab+a[i]，使用第 i+1
      // 根小木棍
      if (dfs(stick, cab + a[i], i + 1)) {
        return true;  // 搜索子树成功
      }
      // 如果回溯，不应再拼相同长度木棍
      fail = a[i];
      // 搜索子树失败，回溯
      v[i] = false;  // 解锁
      // 剪枝 3：从第 stick 根木棍开始拼接整根都失败了
      // 说明 len 长度的木棍根本不可能由 a[stick] 长度的木棍拼成
      // 不要徒劳了
      if (cab == 0) return false;
      // 剪枝 4：如果 a[i] 拼了都拼不上，就只能由 a[j]+a[k]=a[i]
      // 没有必要，完全等效
      if (cab + a[i] == len) return false;
    }
  }
  return false;
}
int main() {
  while (cin >> n && n) {
    int sum = 0, val = 0;
    for (int i = 1; i <= n; ++i) {
      cin >> a[i];
      sum += a[i];
      val = max(val, a[i]);
    }
    sort(a + 1, a + n + 1, greater<>());
    for (len = val; len <= sum; ++len) {
      if (sum % len) continue;
      cnt = sum / len;
      // 清理 v，在 len 长度下进行 dfs
      memset(v, 0, sizeof(v));
      if (dfs(1, 0, 1)) break;
    }
    cout << len << endl;
  }
}
